const fs = require('fs');
const path = require('path');
const archiver = require('archiver');

// 解析命令行参数
const args = process.argv.slice(2);
const includePrisma = !args.includes('--no-prisma');

// 创建输出目录
if (!fs.existsSync('deploy')) {
  fs.mkdirSync('deploy');
}

// 创建输出流
const output = fs.createWriteStream(path.join('deploy', `yzzy-deploy-${new Date().toISOString().slice(0, 10)}.zip`));
const archive = archiver('zip', {
  zlib: { level: 9 } // 最高压缩级别
});

// 监听错误和关闭事件
archive.on('error', (err) => {
  throw err;
});

archive.pipe(output);

// 根据部署文档添加需要的文件和目录
console.log('开始打包部署文件...');

// 1. .next/ 目录
archive.directory('.next/', '.next');
console.log('已添加: .next/');

// 2. public/ 目录
archive.directory('public/', 'public');
console.log('已添加: public/');

// 3. dist/scripts/ 目录
archive.directory('dist/scripts/', 'dist/scripts');
console.log('已添加: dist/scripts/');

// 4. package.json
archive.file('package.json', { name: 'package.json' });
console.log('已添加: package.json');

// 5. package-lock.json
archive.file('package-lock.json', { name: 'package-lock.json' });
console.log('已添加: package-lock.json');

// 6. next.config.ts (或 next.config.js)
const nextConfigFile = fs.existsSync('next.config.ts') ? 'next.config.ts' : 'next.config.js';
archive.file(nextConfigFile, { name: nextConfigFile });
console.log(`已添加: ${nextConfigFile}`);

// 7. prisma/ 目录 (根据命令行参数决定是否包含)
if (includePrisma) {
  archive.directory('prisma/', 'prisma');
  console.log('已添加: prisma/');
} else {
  console.log('跳过添加: prisma/ (--no-prisma 参数生效)');
}

// 8. 添加 PM2 配置文件 (如果有)
if (fs.existsSync('ecosystem.config.js')) {
  archive.file('ecosystem.config.js', { name: 'ecosystem.config.js' });
  console.log('已添加: ecosystem.config.js');
}

// 完成打包
archive.finalize();

output.on('close', () => {
  console.log(`打包完成！总大小: ${(archive.pointer() / 1024 / 1024).toFixed(2)} MB`);
  console.log(`压缩包路径: ${output.path}`);
}); 